package org.jeecg.common.util.oss;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectResult;
import org.apache.tomcat.util.http.fileupload.FileItemStream;
import org.jeecg.common.util.oConvertUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/**
 * @Description: 阿里云 oss 上传工具类(高依赖版)
 * @Date: 2019/5/10
 */
public class OssBootUtil {

	private static String endPoint;
	private static String accessKeyId;
	private static String accessKeySecret;
	private static String bucketName;
	private static String staticDomain;

	public static void setEndPoint(String endPoint) {
		OssBootUtil.endPoint = endPoint;
	}

	public static void setAccessKeyId(String accessKeyId) {
		OssBootUtil.accessKeyId = accessKeyId;
	}

	public static void setAccessKeySecret(String accessKeySecret) {
		OssBootUtil.accessKeySecret = accessKeySecret;
	}

	public static void setBucketName(String bucketName) {
		OssBootUtil.bucketName = bucketName;
	}

	public static void setStaticDomain(String staticDomain) {
		OssBootUtil.staticDomain = staticDomain;
	}

	/**
	 * oss 工具客户端
	 */
	private static OSSClient ossClient = null;
	private static String FILE_URL;

	/**
	 * 上传文件至阿里云 OSS
	 * 文件上传成功,返回文件完整访问路径
	 * 文件上传失败,返回 null
	 *
	 * @param file    待上传文件
	 * @param fileDir 文件保存目录
	 * @return oss 中的相对文件路径
	 */
	public static String upload(MultipartFile file, String fileDir) {
		initOSS(endPoint, accessKeyId, accessKeySecret);
		StringBuilder fileUrl = new StringBuilder();
		try {
			String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
			String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
			if (!fileDir.endsWith("/")) {
				fileDir = fileDir.concat("/");
			}
			fileUrl = fileUrl.append(fileDir + fileName);

			if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
				FILE_URL = staticDomain + "/" + fileUrl;
			} else {
				FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
			}
			PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.getInputStream());
			// 设置权限(公开读)
			ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
			if (result != null) {
				System.out.println("------OSS文件上传成功------" + fileUrl);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		return FILE_URL;
	}


	/**
	 * 上传文件至阿里云 OSS
	 * 文件上传成功,返回文件完整访问路径
	 * 文件上传失败,返回 null
	 *
	 * @param file    待上传文件
	 * @param fileDir 文件保存目录
	 * @return oss 中的相对文件路径
	 */
	public static String upload(FileItemStream file, String fileDir) {
		initOSS(endPoint, accessKeyId, accessKeySecret);
		StringBuilder fileUrl = new StringBuilder();
		try {
			String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
			String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
			if (!fileDir.endsWith("/")) {
				fileDir = fileDir.concat("/");
			}
			fileUrl = fileUrl.append(fileDir + fileName);

			if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
				FILE_URL = staticDomain + "/" + fileUrl;
			} else {
				FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
			}
			PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
			// 设置权限(公开读)
			ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
			if (result != null) {
				System.out.println("------OSS文件上传成功------" + fileUrl);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		return FILE_URL;
	}

	/**
	 * 删除文件
	 * @param url
	 */
	public static void deleteUrl(String url) {
		String bucketUrl = "https://" + bucketName + "." + endPoint + "/";
		//String bucketUrl = staticDomain + "/";
		url = url.replace(bucketUrl,"");
		ossClient.deleteObject(bucketName, url);
	}

	/**
	 * 删除文件
	 * @param fileName
	 */
	public static void delete(String fileName) {
		ossClient.deleteObject(bucketName, fileName);
	}

	/**
	 * 初始化 oss 客户端
	 *
	 * @return
	 */
	private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
		if (ossClient == null) {
			ossClient = new OSSClient(endpoint,
				new DefaultCredentialProvider(accessKeyId, accessKeySecret),
				new ClientConfiguration());
		}
		return ossClient;
	}

}
